import { queryParams } from '../function/params'
import store from '@/store'

/**
 * 路由跳转
 */

// 是否正在跳转
let _isRouting = false

// 需要授权才能访问的页面
let needLoginRoute = ['pages/user/*']

export function router(options = {}) {
  if (_isRouting) {
    return
  }
  _isRouting = true

  let config = {
    type: 'navigateTo',
    url: '',
    delta: 1, // navigateBack页面后退时,回退的层数
    params: {}, // 传递的参数
    animationType: 'pop-in', // 窗口动画,只在APP有效
    animationDuration: 300, // 窗口动画持续时间,单位毫秒,只在APP有效
    needLogin: false,
    complete() {
      _isRouting = false
    },
  }

  if (typeof options === 'string') {
    config.url = options
  } else {
    config = Object.assign(config, options)
  }
  // 如果url没有"/"开头，添加上，因为uni的路由跳转需要"/"开头
  config.url = config.url[0] != '/' && config.url[0] != '.' ? '/' + config.url : config.url

  // 检测是否自动拦截
  needLoginRoute.map((item) => {
    if (new RegExp(item).test(config.url)) {
      config.needLogin = true
    }
  })
  if (config.needLogin && !store.state.user.token) {
    uni.showToast({
      title: this.$t('utils_router_index_msg_eb1bc96c'),
    })
    uni.navigateTo({
      url: '/pages/account/login/login',
      complete: config.complete,
    })
    return
  }

  // 判断是否有传递显式的参数,Object.keys转为数组并判断长度,switchTab类型时不能携带参数
  if (Object.keys(config.params).length && config.type != 'switchTab') {
    // 判断用户传递的url中，是否带有参数
    // 使用正则匹配，主要依据是判断是否有"/","?","="等，如“/page/index/index?name=mary"
    // 如果有url中有get参数，转换后无需带上"?"
    let query = ''
    if (/.*\/.*\?.*=.*/.test(config.url)) {
      // object对象转为get类型的参数
      query = queryParams(config.params, false)
      // 因为已有get参数,所以后面拼接的参数需要带上"&"隔开
      config.url += '&' + query
    } else {
      query = queryParams(config.params)
      config.url += query
    }
  }

  // 执行路由跳转
  if (config.type == 'navigateTo' || config.type == 'to') {
    return uni.navigateTo({
      url: config.url,
      animationType: config.animationType,
      animationDuration: config.animationDuration,
      complete: config.complete,
    })
  }
  if (config.type == 'redirectTo' || config.type == 'redirect') {
    return uni.redirectTo({
      url: config.url,
      complete: config.complete,
    })
  }
  if (config.type == 'switchTab' || config.type == 'tab') {
    return uni.switchTab({
      url: config.url,
      complete: config.complete,
    })
  }
  if (config.type == 'reLaunch') {
    return uni.reLaunch({
      url: config.url,
      complete: config.complete,
    })
  }
  if (config.type == 'navigateBack' || config.type == 'back') {
    return uni.navigateBack({
      delta: parseInt(config.delta ? config.delta : this.delta),
      complete: config.complete,
    })
  }
}
